package array.spiralMatrix;

/**
 * 给你一个正整数 n ，生成一个包含 1 到 n2 所有元素，且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
 */
public class N59_SpiralMatrix {
    public int[][] generateMatrix(int n) {

        int[][] matrix = new int[n][n];
        int
                start_x = 0,    // 每一圈x的起始位置
                start_y = 0,    // 每一圈y的起始位置
                loop = n / 2,   // 循环的圈数
                mid = n / 2,    // 矩阵的中点
                num = 1,        // 计数
                offset = 1,     // 偏移量，每一圈需要要减去的数
                x, y;
        while (loop-- > 0) {
            x = start_x;
            y = start_y;

            // 从左到右
            for (x = start_x; x < start_x + n - offset; x++) {
                matrix[y][x] = num++;
            }

            // 从右到下
            for (y = start_y; y < start_y + n - offset; y++) {
                matrix[y][x] = num++;
            }

            // 从右下到左
            for (; x > start_x; x--) {
                matrix[y][x] = num++;
            }

            // 从左下到上
            for (; y > start_y; y--) {
                matrix[y][x] = num++;
            }

            // 更新 x y的起始位置 以及偏移量
            start_x++;
            start_y++;
            offset += 2;

        }

        // 如果 矩阵是奇数阶的，那需要把补上中心点
        if (n % 2 == 1)
            matrix[mid][mid] = num;

        return matrix;
    }

    public static void main(String[] args) {
        N59_SpiralMatrix solution = new N59_SpiralMatrix();
        solution.generateMatrix(7);
    }
}
